home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Netware Super Library
/
Netware Super Library.iso
/
pgm_tool
/
lu62
/
debug
/
apl.asm
next >
Wrap
Assembly Source File
|
1995-07-03
|
11KB
|
422 lines
;**********************************************************
;* *
;* Root APL module *
;* *
;* Function: It's a monitor of transaction programs. *
;* Depends on value of status field and *
;* rc field will be started "aplmain" or *
;* transaction program. *
;* Input: None. *
;* Output: None. *
;* *
;* Last modification: 93-02-05 16:26. *
;* *
;* *
;* CopyRight 1995. Nicholas Poljakov all rights reserved.*
;* *
;**********************************************************
.DOSSEG
.MODEL SMALL
include c:\m61\include\dos.inc
include c:\m61\include\bios.inc
include c:\m61\include\macros.inc
include parms.inc
include crtp.inc
PUBLIC err1, str1, AplCall, LnSiz, CurPath, PathLt, ExCom, AplNm
PUBLIC AplVars, S_AplNm, DosPrmt, InBuff, Apl, NextP, MainCycl, TestDS
PUBLIC StTrans, EndTrans, RunDS, InCycl, CallSys, CmExit, AplExit, TpE
PUBLIC AplParm, LuParm, DosCom, ComSeek, CsFound, SetDosCom, SetEnd, SetDC
EXTRN SysCm :PROC
EXTRN GetDcWD :PROC
EXTRN UpStr :PROC
LU_P_PTR EQU 17 ; offset to field which hold pointer to LuParm
PARM_SZ EQU 24 ; size of a LU parameters area
.STACK 100h
.DATA
Sign DD ?
ORG Sign
DB 'LU62'
AplParm APL_PARM <>
LuParm LU_PARM <>
PARM_SIZ EQU $ - AplParm
err1 DB 13,10,"Must have DOS 2.0 or higher",13,10,"$"
err2 DB 'The LU6.2 module was not installed!',13,10,'$'
str1 DB 'Type ''Exit'' to return into APL.',10,13,'$'
AplCall DB 80 DUP(0) ; "<full path name>aplmain 0"
LnSiz DW 0 ; size of AplCall field
CurPath DB 13,10
DB 60 DUP(0) ; full path name into current directory
PathLt DW 0 ; length of CurPath field
ExCom DB 'EXIT'
AplNm DB 'aplmain.exe '
AplVars DB 0
S_AplNm EQU $ - AplNm
DosPrmt DB 60 DUP(0) ; Dos prompt field
PspSeg DW 0 ; segment address of PSP
DosCom DB 'c:\command.com',0 ; COMSPEC=... line
DB 60 DUP(0) ;
ComSp DB 'COMSPEC='
LT_CS EQU $ - ComSp
InBuff DB 0,0 ; Buffer for input command line
DB 80 DUP(0)
.CODE
Apl PROC
mov ax, _DATA
mov ds, ax
; cli ; Turn off interrupts
; mov ss,ax ; Make SS and
; mov sp, OFFSET STACK ; SP relative to DGROUP
; sti
mov ax, es
mov PspSeg, ax ; save segment address of PSP
; Adjust memory allocation
@GetVer ; Get DOS version
cmp al,3 ; Requires DOS 3.0
jge NextP
@ShowStr err1 ; else error and quit
jmp AplExit
NextP:
mov bx,sp ; Convert stack pointer to paragraphs
mov cl,4 ; to get stack size
shr bx,cl
mov ax, ss
add ax,bx ; Add SS to get end of program
mov bx,es ; Get start of program
sub ax,bx ; Subtract start from end
@ModBlock ax ; Release memory after program
;*
;* Set parm. area to zero
;*
mov ax, ds
mov es, ax
mov di, OFFSET AplParm
xor al, al
mov cx, SIZE AplParm
cld
rep stosb
;*
;* Set pointers in LU parm area to structures APL_PARM and LU_PARM
;*
mov ax, 10h
mov bx, 0a0h
mov es, ax
les bx, DWORD PTR es:[bx] ; pointer to LU parm. table
;* Test if LU 6.2 module is active
mov ax, WORD PTR es:[bx+PARM_SZ+5]
cmp ax, WORD PTR Sign
jne ErrExit
mov ax, WORD PTR es:[bx+PARM_SZ+5+2]
cmp ax, WORD PTR Sign+2
je @F
ErrExit:
@ShowStr err2
@Exit
@@:
add bx, LU_P_PTR
mov si, OFFSET AplParm
mov WORD PTR es:[bx], si
mov ax, ds
mov WORD PTR es:[bx + 2], ax
add bx, 4 ; offset to the field wich will hold
; pointer to LuParm structure
mov si, OFFSET LuParm
mov WORD PTR es:[bx], si
mov WORD PTR es:[bx + 2], ax
;*
;* Prepare initial AplParm values
;*
mov ax, ds
mov es, ax
mov si, OFFSET AplNm
lea di, AplParm.CmLine
mov cx, S_AplNm
cld
rep movsb ; move "aplmain 0" into the command line
;* Set current_directory_name variable
lea si, AplParm.Dir
call GetDcWD
mov AplParm.DirLen, ax
;* Set AplCall field
mov cx, ax ; length of full path name
lea si, AplParm.Dir
mov di, OFFSET AplCall
rep movsb
mov al, '\'
stosb
mov si, OFFSET AplNm
mov cx, S_AplNm
rep movsb
mov ax, AplParm.DirLen
add ax, S_AplNm
inc ax ; extra char to form ASCIIZ string
mov LnSiz, ax
;* Set address of Program_exit for incoming FMH5
mov ax, OFFSET TpE
mov WORD PTR AplParm.Tpe, ax
mov ax, cs
mov WORD PTR AplParm.Tpe + 2, ax
;* Set DosCom field
SetDC:
mov ax, PspSeg
mov es, ax
mov ax, WORD PTR es:[2ch]
mov es, ax ; DOS envirounment field
xor di, di
xor ax, ax
mov cx, 32000
mov dx, cx
cld
repne scasw ; seek end of DOS env. field
sub dx, cx
mov cx, dx ; length of DOS envirounment
shl cx, 1
xor di, di
ComSeek:
mov al, 'C'
repne scasb ; seek first 'C' letter
and cx, cx
jz MainCycl ; not found...
mov dx, di
dec di
mov si, OFFSET ComSp
push cx
mov cx, LT_CS
repe cmpsb
pop cx
jz CsFound
mov di, dx
jmp short ComSeek
CsFound:
push ds
mov ax, es
mov ds, ax
pop es
mov si, di
mov bx, OFFSET DosCom
SetDosCom:
lodsb
and al, al
jz SetEnd
mov BYTE PTR es:[bx], al
inc bx
jmp short SetDosCom
SetEnd:
inc bx
mov BYTE PTR es:[bx], 0
mov ax, es
mov ds, ax ; restore DS
;*
;* Begin main cycle to proceeding of transactions.
;*
MainCycl:
mov ax, ds
mov es, ax ; set ES = DS
lea si, AplParm.CmLine
xor ax, ax
call SysCm
mov ax, AplParm.RetCd ; completed process defined by this
; return code
and ax, ax ; terminate ?
jnz NexTest
jmp AplExit
NexTest:
dec ax
and ax, ax ; start transaction ?
jnz TestDS
jmp StTrans
TestDS:
dec ax
and ax, ax ; DOS shell ?
jz RunDS
dec ax
and ax, ax ; remote Command ?
jz RemCom
jmp AplExit
;*
;* Start and End Transaction processing
;*
StTrans:
mov ax, AplParm.Status
and ax, ax ; is it Start Transaction request ?
jz EndTrans ; no... processing of End Transaction
mov AplParm.Status, 0
jmp MainCycl
EndTrans:
lea di, AplParm.CmLine
mov si, OFFSET AplCall
mov cx, LnSiz
cld
rep movsb
jmp MainCycl
;*
;* Executing remote command
;*
RemCom:
lea si, AplParm.Args
mov ax, 1
call SysCm
lea di, AplParm.CmLine
mov si, OFFSET AplCall
mov cx, LnSiz
cld
rep movsb
jmp MainCycl
;*
;* Accepting and executing commands from keyboard.
;* (DOS shell)
;*
RunDS:
@ShowStr str1
InCycl:
mov si, OFFSET CurPath + 2
call GetDcWD ; get current full path name
mov PathLt, ax
add si, ax ; pointer to end of CurPath
mov BYTE PTR [si], '\'
mov BYTE PTR [si + 1], '>'
mov BYTE PTR [si + 2], '$'
@ShowStr CurPath ; display standart DOS prompt
@GetStr InBuff, 0, 60
cmp InBuff + 1, 4
je CmExit ; test if it's "Exit" command ?
CallSys:
mov si, OFFSET InBuff + 1
mov ax, 1
call SysCm
jmp short InCycl
CmExit:
mov si, OFFSET InBuff + 2
call UpStr
mov di, OFFSET ExCom
mov cx, 4
cld
repne cmpsb
jnz CallSys
;*
;* Processing of "Exit" command
;*
jmp MainCycl
AplExit:
@Exit
Apl ENDP
;*
;* Incoming FMH5 handler
;*
TpE PROC
@SaveRegs ax,cx,bx,si,di,ds,dx,es,bp
mov bp, sp
mov bx, _DATA
mov es, bx ; restore initial DS value
lds si, DWORD PTR [bp + 4] ; DS:SI points to CREATE_TP record
mov bx, OFFSET LuParm
cld
;* LuParm.TpId = CRTP.TpID
mov cx, 8
lea di, es:[bx].TpId
push si
lea si, ds:[si].TpID
rep movsb
pop si
;* LuParm.LuId = CRTP.LuID
mov cx, 8
lea di, es:[bx].LuId
push si
lea si, ds:[si].LuID
rep movsb
pop si
;* Copy Transaction Program Name
mov cx, 40
lea di, es:[bx].TpNm
push si
lea si, ds:[si].Tpn
rep movsb
pop si
;* Copy ConvID
mov ax, WORD PTR ds:[si].ConvID
mov WORD PTR es:[bx], ax
mov ax, WORD PTR ds:[si].ConvID + 2
mov WORD PTR es:[bx + 2], ax
;* AplParm.PgmSt = 1;
mov bx, OFFSET AplParm
mov es:[bx].PgmSt, 1
@RestoreRegs
iret
TpE ENDP
END Apl